上篇說到 NAT 將內部 IP 與外部 IP 互相轉換以達到連線,但不同的 NAT 也會面臨一些連線問題,這種時候穿越防火牆/NAT技術 STUN 和 TURN 扮演著重要的角色,可以來解決連線時受到的限制。
是最著名和最常被使用穿越 NAT 防火牆的解決辦法,它的主要作用是幫助瀏覽器和其他設備發現自己的公共 IP 地址和 port。
當一個裝置(User Agent)想要與其他裝置進行實時通信時,它會發送一個訊息給 STUN 伺服器。這個 STUN 伺服器的工作是從訊息中找出這個裝置的外部位置,然後把這個資訊送回給該裝置。另外,STUN 伺服器還能夠通過一些特殊的測試封包來獲得 NAT 的種類,並告訴裝置如何穿越 NAT以確定裝置的可用 IP 地址。
在 WebRTC 實作時可以用 google 所提供的 stun server
urls: ["stun:stun1.l.google.com:19302", "stun:stun2.l.google.com:19302"]
它的功能比 STUN 更強大。當 STUN 無法克服 NAT 的限制時,TURN提供了一個中繼服務,允許設備之間進行數據通信,即使它們處於不同的 NAT 環境中。
當一個裝置(User Agent)想要與其他裝置進行實時通信時,它向TURN伺服器發送一個"TURN allocate"請求,伺服器會記住請求的 IP 位址和 Port ,然後回覆一個公共 IP 位址和 Port,客戶端可以將資料發送到伺服器分配的公共Port上,充當中繼者。
雖然這種方法可以克服防火牆,但它卻變成 Client-Server模式,導致伺服器承擔所有流量。
以上就是 STUN/TURN 用來解決 NAT 穿越的困難,下篇會說到 WebRTC 所使用的 ICE(Interactive Connectivity Establishment)它不僅包括 STUN 和 TURN,還提供了一個綜合的方法,以確定最佳的通訊路徑協議來處理連接建立中的 NAT 穿越和防火牆問題。
參考資料
真的寫得很好 👉 cs.nccu.edu.tw/~lien/Writing/NGN/firewall.htm